/* 
 * File:   newsimpletest.cpp
 * Author: max
 *
 * Created on Nov 18, 2012, 3:46:20 PM
 */

#include <stdlib.h>
#include <iostream>
#include "PajaritoAzul.h"
#include "Cerdito.h"
#include "HuevoBlanco.h"
#include "HuevoPoche.h"
#include "HuevoCodorniz.h"
#include "HuevoReloj.h"
#include "Trayectoria.h"
#include "Perimetro.h"
#include "Caja.h"
#include "Escenario.h"
#include "Partida.h"
#include "Nivel.h"
#include "Mundo.h"

/*
 * Simple C++ Test Suite
 */
using namespace TP::Juego;
using namespace TP::Juego::Arena;
using namespace TP::Juego::Arena::Actores;
using namespace TP::Juego::Motorizacion::Fisica;
using namespace TP::Juego::Arena::Utilidades;


void test1() {
    std::cout << "newsimpletest test 1" << std::endl;
    
    Posicion posicion(10, 10);
    Vector2D velocidad(20, 20);
    Vector2D aceleracion(30, 30);
    
    Trayectoria trayectoria(&posicion, &velocidad, &aceleracion);
    
    PajaritoAzul pajarito("veiga la concha de tu madre");
    pajarito.setTrayectoria(&trayectoria);
    
    cout << pajarito.aXML();
    
}

void test2() {
    std::cout << "newsimpletest test 2" << std::endl;
    
    Posicion posicion(10, 10);
    Vector2D velocidad(20, 20);
    Vector2D aceleracion(30, 30);
    
    Trayectoria trayectoria(&posicion, &velocidad, &aceleracion);
    
    PajaritoAzul pajarito("twetty");
    pajarito.setTrayectoria(&trayectoria);
    
    PajaritoAzul pajarito2;
    string str = pajarito.aXML();
    pajarito2.parseXML(str);
    
    //if(pajarito.getTrayectoria()->getPosicion()->X() != 10 && strcmp (pajarito.getRol()->Nombre().c_str(), PAJARITOAZUL) == 0)
    if(pajarito2.getTrayectoria()->getPosicion()->X() != 10 && strcmp (pajarito2.getRol()->Nombre().c_str(), PAJARITO) == 0)
        std::cout << "%TEST_FAILED% time=0 testname=test2 (newsimpletest) message=posicion inicial del pajarito rehidratado no es la esperada" << std::endl;
}

void test3(){
    std::cout << "newsimpletest test 3" << std::endl;

    // Prueba de serializacion/deserializacion de un pajarito.    
    PajaritoAzul* pajarito = new PajaritoAzul ("tweety");
    pajarito->setTrayectoria(new Trayectoria(new Posicion (5,5), new Vector2D (0,0), new Vector2D (0,0)));
    PajaritoAzul* pajarito2 = new PajaritoAzul();
    pajarito2->parseXML(pajarito->aXML());

    if (pajarito2->getTrayectoria()->getPosicion()->X() != 5 || pajarito2->getTrayectoria()->getPosicion()->Y() != 5)
        std::cout << "%TEST_FAILED% time=0 testname=test3 (newsimpletest) message=posicion inicial de tweety clon no es la esperada." << std::endl;        
    

    // Prueba de serializacion/deserializacion de un huevo blanco.    
    HuevoBlanco* huevoBlanco = new HuevoBlanco ("HuevoBlanco");
    huevoBlanco ->setTrayectoria(new Trayectoria(new Posicion (10,10), new Vector2D (0,0), new Vector2D (0,0)));
    HuevoBlanco* huevoBlanco2 = new HuevoBlanco();
    huevoBlanco2->parseXML(huevoBlanco ->aXML());

    if (huevoBlanco2->getTrayectoria()->getPosicion()->X() != 10 || huevoBlanco2->getTrayectoria()->getPosicion()->Y() != 10)
        std::cout << "%TEST_FAILED% time=0 testname=test3 (newsimpletest) message=posicion inicial del huevoBlanco clon no es la esperada." << std::endl;        


    // Prueba de serializacion/deserializacion de un huevo codorniz.    
    HuevoCodorniz* huevoCodorniz = new HuevoCodorniz ("HuevoCodorniz");
    huevoCodorniz->setTrayectoria(new Trayectoria(new Posicion (20,20), new Vector2D (0,0), new Vector2D (0,0)));
    HuevoCodorniz* huevoCodorniz2 = new HuevoCodorniz();
    huevoCodorniz2->parseXML(huevoCodorniz->aXML());

    if (huevoCodorniz2->getTrayectoria()->getPosicion()->X() != 20 || huevoCodorniz2->getTrayectoria()->getPosicion()->Y() != 20)
        std::cout << "%TEST_FAILED% time=0 testname=test3 (newsimpletest) message=posicion inicial del huevoCodorniz clon no es la esperada." << std::endl;        
    
    
    // Prueba de serializacion/deserializacion de un huevo poche.    
    HuevoPoche* huevoPoche = new HuevoPoche ("HuevoPoche");
    huevoPoche->setTrayectoria(new Trayectoria(new Posicion (15,15), new Vector2D (0,0), new Vector2D (0,0)));
    HuevoPoche* huevoPoche2 = new HuevoPoche();
    huevoPoche2->parseXML(huevoPoche->aXML());

    if (huevoPoche2->getTrayectoria()->getPosicion()->X() != 15 || huevoPoche2->getTrayectoria()->getPosicion()->Y() != 15)
        std::cout << "%TEST_FAILED% time=0 testname=test3 (newsimpletest) message=posicion inicial del huevoPoche clon no es la esperada." << std::endl;        
    
    
    // Prueba de serializacion/deserializacion de un huevo reloj.    
    HuevoReloj* huevoReloj = new HuevoReloj ("HuevoReloj", 10);
    huevoReloj->setTrayectoria(new Trayectoria(new Posicion (25,25), new Vector2D (0,0), new Vector2D (0,0)));
    HuevoReloj* huevoReloj2 = new HuevoReloj();
    huevoReloj2->parseXML(huevoReloj->aXML());

    if (huevoReloj2->getTrayectoria()->getPosicion()->X() != 25 || huevoReloj2->getTrayectoria()->getPosicion()->Y() != 25)
        std::cout << "%TEST_FAILED% time=0 testname=test3 (newsimpletest) message=posicion inicial del huevoReloj clon no es la esperada." << std::endl;        
    

    // Prueba de serializacion/deserializacion de un cerdito.    
    Cerdito* cerdito = new Cerdito ("Carlos");
    cerdito->setTrayectoria(new Trayectoria(new Posicion (30,30), new Vector2D (0,0), new Vector2D (0,0)));
    Cerdito* cerdito2 = new Cerdito();
    cerdito2->parseXML(cerdito->aXML());

    if (cerdito2->getTrayectoria()->getPosicion()->X() != 30 || cerdito2->getTrayectoria()->getPosicion()->Y() != 30)
        std::cout << "%TEST_FAILED% time=0 testname=test3 (newsimpletest) message=posicion inicial del cerdito clon no es la esperada." << std::endl;        
    

    // Prueba de serializacion/deserializacion de un perimetro.
    Perimetro* perimetro = new Perimetro ("miPerimetro", 10, 10);
    Perimetro* perimetro2 = new Perimetro();
    perimetro2->parseXML(perimetro->aXML());
    
    if (!(perimetro2->getAlto() == 10 && perimetro2->getAncho() == 10 && perimetro2->getNombre() == "miPerimetro"))
        std::cout << "%TEST_FAILED% time=0 testname=test3 (newsimpletest) message=el perimetro no posee las dimensiones o el nombre esperados." << std::endl;                

    
    Caja* caja = new Caja ("miCaja");
    caja->setPosicion(new Posicion(20,20));

    Caja* caja2 = new Caja();
    caja2->parseXML(caja->aXML());
    
    if (!(caja2->getNombre() == "miCaja" && caja2->getPosicion()->X() == 20 && caja2->getPosicion()->Y() == 20))
        std::cout << "%TEST_FAILED% time=0 testname=test3 (newsimpletest) message=La caja no posee la dimension o el nombre esperados." << std::endl;                
    
    delete pajarito;
    delete pajarito2;
    delete huevoBlanco ;
    delete huevoBlanco2;
    delete huevoCodorniz ;
    delete huevoCodorniz2;   
    delete huevoPoche ;
    delete huevoPoche2;    
    delete huevoReloj ;
    delete huevoReloj2;    
    delete cerdito ;
    delete cerdito2;    
    delete perimetro;
    delete perimetro2;
    delete caja;
    delete caja2;
    
}

void test4 (){

    std::cout << "newsimpletest test 4" << std::endl;
    
    Escenario* escenario = new Escenario (20, 20, "PNGFondoPath");
    
    // Instancio un pajarito en la posicion (10, 10).
    escenario->addActor(new PajaritoAzul("tweety"), new Posicion (10,10), new Vector2D (0,0), new Vector2D (0,0));
    escenario->addUtilidad(new Caja ("madera"), new Posicion (15,15));
    
    Escenario* escenario2 = new Escenario();
    escenario2->parseXML(escenario->aXML());
    
    cout << endl << escenario->aXML() << endl;
    cout << endl << escenario2->aXML() << endl;
    
    if (!(escenario->getActorPorNombre("tweety")->getTrayectoria()->getPosicion()->X() == 10 && escenario->getActorPorNombre("tweety")->getTrayectoria()->getPosicion()->Y() == 10))
        std::cout << "%TEST_FAILED% time=0 testname=test4 (newsimpletest) message=Tweety no esta donde deberia estar dentro del escenario." << std::endl;                

    if (! (escenario->getUtilidades()[0]->getPosicion()->X() == 15 && escenario->getUtilidades()[0]->getPosicion()->Y() == 15))
        std::cout << "%TEST_FAILED% time=0 testname=test4 (newsimpletest) message=La caja no esta donde deberia estar dentro del escenario." << std::endl;                
    
    escenario->liberar();
    delete escenario;
}

void test5 (){
    std::cout << "newsimpletest test 4" << std::endl;
    
    
    Escenario* escenario = new Escenario (20, 20, "PNGFondoPath");
    
    // Instancio un pajarito en la posicion (10, 10).
    escenario->addActor(new PajaritoAzul("tweety"), new Posicion (10,10), new Vector2D (0,0), new Vector2D (0,0));
    escenario->addUtilidad(new Caja ("madera"), new Posicion (15,15));
    
    Escenario* escenario2 = new Escenario();
    escenario2->parseXML(escenario->aXML());
    
    if (!(escenario->getActorPorNombre("tweety")->getTrayectoria()->getPosicion()->X() == 10 && escenario->getActorPorNombre("tweety")->getTrayectoria()->getPosicion()->Y() == 10))
        std::cout << "%TEST_FAILED% time=0 testname=test4 (newsimpletest) message=Tweety no esta donde deberia estar dentro del escenario." << std::endl;                

    if (! (escenario->getUtilidades()[0]->getPosicion()->X() == 15 && escenario->getUtilidades()[0]->getPosicion()->Y() == 15))
        std::cout << "%TEST_FAILED% time=0 testname=test4 (newsimpletest) message=La caja no esta donde deberia estar dentro del escenario." << std::endl;                
    
    // Clono la partida mediante la funcionalidad de serializacion.
    Jugador* jugador = new Jugador("pablo");
    Partida* partida = new Partida ("miPartida", escenario, jugador);
    /*
    Partida* partida2 = new Partida();
    partida2->parseXML(partida->aXML());
    */
    Partida* partida2 = Partida::crearDeXML(partida->aXML());
    
    if (!(partida2->ArenaJuego()->getActorPorNombre("tweety")->getTrayectoria()->getPosicion()->X() == 10 && partida2->ArenaJuego()->getActorPorNombre("tweety")->getTrayectoria()->getPosicion()->Y() == 10))
        std::cout << "%TEST_FAILED% time=0 testname=test5 (newsimpletest) message=tweety no esta en la posicion de la arena que se esperaba." << std::endl;                

    //@todo: Falta probar la serializacion/deserializacion de jugadores en la partida.
}

void test6() {

    /* Prueba de la serializacion/deserializacion de un nivel de juego.
     */
    
    std::cout << "newsimpletest test 6" << std::endl;

    Nivel* nivel = new Nivel(0, 20, 20, 1000, "Mi Nivel");

    nivel->getEscenario()->addActor(new PajaritoAzul("tweety"), new Posicion (10,10), new Vector2D (0,0), new Vector2D (0,0));
    nivel->getEscenario()->addUtilidad(new Caja ("madera"), new Posicion (15,15));            

    if (!(nivel->getEscenario()->getActorPorNombre("tweety")->getTrayectoria()->getPosicion()->X() == 10 && nivel->getEscenario()->getActorPorNombre("tweety")->getTrayectoria()->getPosicion()->Y() == 10))
        std::cout << "%TEST_FAILED% time=0 testname=test4 (newsimpletest) message=Tweety no esta donde deberia estar dentro del escenario." << std::endl;                

    if (! (nivel->getEscenario()->getUtilidades()[0]->getPosicion()->X() == 15 && nivel->getEscenario()->getUtilidades()[0]->getPosicion()->Y() == 15))
        std::cout << "%TEST_FAILED% time=0 testname=test4 (newsimpletest) message=La caja no esta donde deberia estar dentro del escenario." << std::endl;                
    
    Nivel* nivel2 = new Nivel();
    nivel2->parseXML(nivel->aXML());
    
    if (!(nivel2->getEscenario()->getActorPorNombre("tweety")->getTrayectoria()->getPosicion()->X() == 10 && nivel2->getEscenario()->getActorPorNombre("tweety")->getTrayectoria()->getPosicion()->Y() == 10))
        std::cout << "%TEST_FAILED% time=0 testname=test6 (newsimpletest) message=tweety no esta en la posicion de la arena que se esperaba." << std::endl;                
}

void test7() {
    
    std::cout << "newsimpletest test 7" << std::endl;

    Mundo* mundo = new Mundo("Tierra");
    mundo->crearNivel(0, 20, 20, 1000, "ImagenFondoPath");
    
    mundo->getNivel(0)->getEscenario()->addActor(new PajaritoAzul("tweety"), new Posicion (10,10), new Vector2D (0,0), new Vector2D (0,0));
    mundo->getNivel(0)->getEscenario()->addUtilidad(new Caja ("madera"), new Posicion (15,15));            

    Mundo* mundo2 = new Mundo();
    mundo2->parseXML(mundo->aXML());
    
    if (!(mundo2->getNivel(0)->getEscenario()->getActorPorNombre("tweety")->getTrayectoria()->getPosicion()->X() == 10 && mundo2->getNivel(0)->getEscenario()->getActorPorNombre("tweety")->getTrayectoria()->getPosicion()->Y() == 10))
        std::cout << "%TEST_FAILED% time=0 testname=test6 (newsimpletest) message=tweety no esta en la posicion de la arena que se esperaba." << std::endl;                
    
    cout << endl << mundo->aXML() << endl;
}

void test8(){
    std::cout << "newsimpletest test 8" << std::endl;
    
    Jugador* jugador = new Jugador ("maxi");
    Jugador* jugadorClon = Jugador::crearDeXML(jugador->aXML());
    
    if (jugadorClon->getNombre() != "maxi")
        std::cout << "%TEST_FAILED% time=0 testname=test6 (newsimpletest) message=El jugador clon no posee el nombre que se esperaba." << std::endl;                

}
int main(int argc, char** argv) {
    std::cout << "%SUITE_STARTING% newsimpletest" << std::endl;
    std::cout << "%SUITE_STARTED%" << std::endl;

    std::cout << "%TEST_STARTED% test1 (newsimpletest)" << std::endl;
    test1();
    std::cout << "%TEST_FINISHED% time=0 test1 (newsimpletest)" << std::endl;

    std::cout << "%TEST_STARTED% test2 (newsimpletest)\n" << std::endl;
    test2();
    std::cout << "%TEST_FINISHED% time=0 test2 (newsimpletest)" << std::endl;

    std::cout << "%TEST_STARTED% test3 (newsimpletest)\n" << std::endl;
    test3();
    std::cout << "%TEST_FINISHED% time=0 test3 (newsimpletest)" << std::endl;

    std::cout << "%TEST_STARTED% test4 (newsimpletest)\n" << std::endl;
    test4();
    std::cout << "%TEST_FINISHED% time=0 test4 (newsimpletest)" << std::endl;

    std::cout << "%TEST_STARTED% test5 (newsimpletest)\n" << std::endl;
    test5();
    std::cout << "%TEST_FINISHED% time=0 test5 (newsimpletest)" << std::endl;

    std::cout << "%TEST_STARTED% test6 (newsimpletest)\n" << std::endl;
    test6();
    std::cout << "%TEST_FINISHED% time=0 test6 (newsimpletest)" << std::endl;

    std::cout << "%TEST_STARTED% test7 (newsimpletest)\n" << std::endl;
    test7();
    std::cout << "%TEST_FINISHED% time=0 test7 (newsimpletest)" << std::endl;

    std::cout << "%TEST_STARTED% test8 (newsimpletest)\n" << std::endl;
    test8();
    std::cout << "%TEST_FINISHED% time=0 test8 (newsimpletest)" << std::endl;

    std::cout << "%SUITE_FINISHED% time=0" << std::endl;

    return (EXIT_SUCCESS);
}

